﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Media;
using System.Collections.ObjectModel;
using System.Data;
using System.Windows.Media.Imaging;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows.Controls;
using System.Globalization;
using produccion.modelo;
using produccion.AccesoDatos;
using produccion.clases;
using System.Windows.Input;
using System.Collections.Specialized;

namespace produccion.vistamodelo
{
    class VMConsultaExistencias : ViewModelBase, IDataErrorInfo
    {
        #region Campos
        
        private CLSMAEMAT _materiales = new CLSMAEMAT();
        private CLSMAEGRP _infogrupo = new CLSMAEGRP();
        private CLSMAESUB _infoSubgrupo = new CLSMAESUB();
        private CLSENCUNI _unidades = new CLSENCUNI();
        private CLSMAEMTP _existencia = new CLSMAEMTP();

        #endregion

        #region Constructor

        public VMConsultaExistencias()
        {
            try
            {
                List<CLSMAEMAT> lisMat = new CLSMAEMAT().LisMateriales();
                _buscaMatPri = new VMbuscarGeneral((from mp in lisMat
                                                    select new VMlistaGenerica { strColumna1 = mp.CODMAT_MAT, strColumna2 = mp.NOMMAT_MAT }).ToList());
                buscaMatPri.PropertyChanged += onBuscarMateriaPrimaPropertyChanged;
                buscaMatPri.gridBuscar.columna1.strNombre = "Código MP";
                buscaMatPri.gridBuscar.columna2.strNombre = "Nombre Materia Prima";

                if (MDOgeneral.conexion == null || MDOgeneral.conexion.State == ConnectionState.Closed)
                {
                    MDOgeneral.conectar();
                }
                strTituloVentana = "F3 Consulta Existencias" + " - Usuario: " + MDOgeneral.usuario + " - [FRMConsultaExistencias]";
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        #endregion

        #region Interfaces publicas

        public string strCodigo
        {
            get { return _materiales.CODMAT_MAT; }
            set 
            { 
                _materiales.CODMAT_MAT = value;
                if (value.Length == 6)
                    ConsultaMat();
                base.OnPropertyChanged("strCodigo"); 
            }
        }

        public string strNombre
        {
            get { return _materiales.NOMMAT_MAT; }
            set { _materiales.NOMMAT_MAT = value; base.OnPropertyChanged("strNombre"); }
        }

        public string strGrupo
        {
            get { return _materiales.CODGRP_MAT; }
            set { _materiales.CODGRP_MAT = value; base.OnPropertyChanged("strGrupo"); }
        }

        private string _strNombreGrupo;
        public string strNombreGrupo
        {
            get { return _strNombreGrupo; }
            set { _strNombreGrupo = value; base.OnPropertyChanged("strNombreGrupo"); }
        }

        public string strSubgrupo
        {
            get { return _materiales.CODSUB_MAT; }
            set { _materiales.CODSUB_MAT = value; base.OnPropertyChanged("strSubgrupo"); }
        }

        private string _strNombreSubgrupo;
        public string strNombreSubgrupo
        {
            get { return _strNombreSubgrupo; }
            set { _strNombreSubgrupo = value; base.OnPropertyChanged("strNombreSubgrupo"); }
        }

        public string strUnidadUso
        {
            get { return _materiales.UNIUSU_MAT; }
            set { _materiales.UNIUSU_MAT = value; base.OnPropertyChanged("strUnidadUso"); }
        }

        private string _strNombreUnidadUso;
        public string strNombreUnidadUso
        {
            get { return _strNombreUnidadUso; }
            set { _strNombreUnidadUso = value; base.OnPropertyChanged("strNombreUnidadUso"); }
        }

        public string strUnidadCompra
        {
            get { return _materiales.UNICOM_MAT; }
            set { _materiales.UNICOM_MAT = value; base.OnPropertyChanged("strUnidadCompra"); }
        }

        private string _strNombreUnidadCompra;
        public string strNombreUnidadCompra
        {
            get { return _strNombreUnidadCompra; }
            set { _strNombreUnidadCompra = value; base.OnPropertyChanged("strNombreUnidadCompra"); }
        }

        private ObservableCollection<VMExistencia> _lisexistencias = new ObservableCollection<VMExistencia>();
        public ObservableCollection<VMExistencia> lisexistencias
        {
            get { return _lisexistencias; }
            set { _lisexistencias = value; base.OnPropertyChanged("lisexistencias"); }
        }

        private VMExistencia _selexistencia;
        public VMExistencia selexistencia
        {
            get { return _selexistencia; }
            set 
            { 
                _selexistencia = value; 
                base.OnPropertyChanged("selexistencia");
                if (selexistencia != null)
                {
                    if (selexistencia.strCodigoMaterial != null)
                    {
                        if (!String.IsNullOrEmpty(selexistencia.strCodigoMaterial))
                        {
                            visorFotoReferencia.strColor = selexistencia.strColor;
                        }
                        else
                            visorFotoReferencia.strColor = "";
                    }
                }
            }
        }

        private List<CLSMAEMTP> _lismatpri = new List<CLSMAEMTP>();
        public List<CLSMAEMTP> lismatpri
        {
            get { return _lismatpri; }
            set { _lismatpri = value; base.OnPropertyChanged("lismatpri"); }
        }

        private VMbuscarGeneral _buscaMatPri;
        public VMbuscarGeneral buscaMatPri
        {
            get { return _buscaMatPri; }
            set { _buscaMatPri = value; base.OnPropertyChanged("buscaMatPri"); }
        }

        private MDOgeneral.mensaje _msn = new MDOgeneral.mensaje();
        public MDOgeneral.mensaje msn
        {
            get { return _msn; }
            set { _msn = value; base.OnPropertyChanged("msn"); }
        }

        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; base.OnPropertyChanged("strTituloVentana"); }
        }

        private VMvisorFotoReferencia _visorFotoReferencia = new VMvisorFotoReferencia();
        public VMvisorFotoReferencia visorFotoReferencia
        {
            get { return _visorFotoReferencia; }
            set { _visorFotoReferencia = value; base.OnPropertyChanged("visorFotoReferencia"); }
        }

        #endregion

        #region Metodos


        void ConsultaMat()
        {
            try
            {
                _materiales.ConsMat();

                if (_materiales.EXISTE)
                {
                    strNombre = _materiales.NOMMAT_MAT;
                    visorFotoReferencia.strCodigo = _materiales.CODMAT_MAT;

                    _infogrupo.CODGRP_GRP = strGrupo;
                    _infogrupo.consultar();
                    strNombreGrupo = _infogrupo.NOMGRP_GRP;
                    strGrupo = strGrupo + " - " + strNombreGrupo;

                    _infoSubgrupo.CODSUB_SUB = strSubgrupo;
                    _infoSubgrupo.CODGRP_SUB = strGrupo.Substring(0, 1);
                    _infoSubgrupo.consultar();
                    strNombreSubgrupo = _infoSubgrupo.NOMSUB_SUB;
                    strSubgrupo = strSubgrupo + " - " + strNombreSubgrupo;

                    _unidades.CODUNI_EUN = strUnidadCompra;
                    _unidades.Consultar();
                    strNombreUnidadCompra = strUnidadCompra + " - " + _unidades.NOMUNI_EUN;

                    _unidades.CODUNI_EUN = strUnidadUso;
                    _unidades.Consultar();
                    strNombreUnidadUso = strUnidadUso + " - " + _unidades.NOMUNI_EUN;

                    _existencia.CODMAT_MTP = strCodigo;
                    lismatpri = _existencia.ListarMatPri();

                    Int32 numCanti = 0;
                    List<VMExistencia> all = (from lis in lismatpri select new VMExistencia(lis)).ToList();
                    foreach (VMExistencia xx in all)
                    {
                        numCanti++;
                    }

                    lisexistencias = new ObservableCollection<VMExistencia>(all);
                }
                else
                {
                    if (visorFotoReferencia != null)
                    {
                        visorFotoReferencia.strCodigo = "";
                    }
                }

            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }

        }

        public void Salir(Object frmformulario)
        {
            ((Window)frmformulario).Close();
        }

        private void buscarMatPri()
        {
            try
            {
                buscaMatPri.IsOpen = true;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void onBuscarMateriaPrimaPropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                try
                {
                    if (e.PropertyName == "IsOpen")
                    {
                        if (buscaMatPri.gridBuscar.selLista != null)
                        {
                            if (buscaMatPri.gridBuscar.selLista.strColumna1 != null)
                            {
                                strCodigo = buscaMatPri.gridBuscar.selLista.strColumna1;
                                ConsultaMat();
                            }
                        }
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }
        

        #endregion

        #region Comandos

        RelayCommand _cmdBuscarMatPri;
        public ICommand cmdBuscarMatPri
        {
            get
            {
                if (_cmdBuscarMatPri == null)
                {
                    _cmdBuscarMatPri = new RelayCommand(x => buscarMatPri());
                }
                return _cmdBuscarMatPri;
            }
        }

        RelayCommand _cmdSalir;
        public ICommand cmdSalir
        {
            get
            {
                if (_cmdSalir == null)
                {
                    _cmdSalir = new RelayCommand(Salir);
                }
                return _cmdSalir;
            }
        }

        #endregion

        #region IDataErrorInfo Members

        string IDataErrorInfo.Error { get { return null; } }

        string IDataErrorInfo.this[string propertyName]
        {
            get { return this.GetValidationError(propertyName); }
        }

        #endregion

        #region Validation

        /// <summary>
        /// Returns true if this object has no validation errors.
        /// </summary>
        /// 

        public bool IsValid
        {
            get
            {
                foreach (string property in ValidatedProperties)
                    if (GetValidationError(property) != null)
                        return false;

                return true;
            }
        }

        static readonly string[] ValidatedProperties = 
            { 
                "strCodigo"
            };

        string GetValidationError(string propertyName)
        {
            if (Array.IndexOf(ValidatedProperties, propertyName) < 0)
                return null;

            string error = null;

            switch (propertyName)
            {
                case "strCodigo":
                    error = this.ValidateCodigo();
                    break;
                default:
                    Debug.Fail("Unexpected property being validated on Customer: " + propertyName);
                    break;
            }
            return error;
        }

        

        string ValidateCodigo()
        {
            try
            {
                if (strCodigo == null) { return "Debe ingresar un código de taerial."; }

                return null;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }

        #endregion
    }

    public class VMExistencia: ViewModelBase
    {

        #region Campos

        private CLSMAEMTP _mate = new CLSMAEMTP();
        private ProcesoProduccionRepositorio _rep = new ProcesoProduccionRepositorio();

        #endregion

        #region Constructor

        public VMExistencia(CLSMAEMTP mate)
        {
            _mate = mate;
        }

        #endregion

        #region Metodos

        public CLSMAEMTP getExistecia()
        {
            return _mate;
        }

        #endregion

        #region Interfaces publicas

        public string strCodigoMaterial
        {
            get { return _mate.CODMAT_MTP; }
        }

        public string strColor
        {
            get { return _mate.CODCOL_MTP; }
            set { _mate.CODCOL_MTP = value; base.OnPropertyChanged("strColor"); }
        }

        public string strCodBar
        {
            get { return _mate.CODBAR_MTP; }
            set { _mate.CODBAR_MTP = value; base.OnPropertyChanged("strCodBar"); }
        }

        public Double numExistencia
        {
            get { return _mate.EXIMTP_MTP; }
            set { _mate.EXIMTP_MTP = value; base.OnPropertyChanged("numExistencia"); }
        }

        public Double numCanSep
        {
            get { return _mate.CANSEP_MTP; }
            set { _mate.CANSEP_MTP = value; base.OnPropertyChanged("numCanSep"); }
        }

        public string strNombreColor
        {
            get { return _mate.NOMCOLOR; }
            set { _mate.NOMCOLOR = value; base.OnPropertyChanged("strNombreColor"); }
        }

        #endregion

    }
}
